package cc.owoo.godpen.network.http;

import cc.owoo.godpen.analysis.html.Document;
import cc.owoo.godpen.analysis.json.Json;

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Arrays;

/**
 * 携带内容数据的抽象的HTTP报文
 * Created by nimensei
 * 2022-02-25 下午 05:38
 **/
public class AbstractContent extends AbstractHeader {
    byte[] content;// 内容数据

    @Override
    public void initialize() {
        super.initialize();
        content = null;
    }

    /**
     * 将内容保存到本地
     *
     * @param file 本地文件路径
     */
    public boolean save(File file) {
        if (file == null)
            throw new NullPointerException("文件对象不能为空");
        if (content == null)
            return false;
        try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
            fileOutputStream.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 拷贝对象
     *
     * @param abstractContent 拷贝源
     */
    public void copySetContent(AbstractContent abstractContent) {
        if (abstractContent.content == null)
            content = null;
        else
            content = Arrays.copyOf(abstractContent.content, abstractContent.content.length);
    }

    /**
     * 获取内容编码
     *
     * @return 内容编码
     */
    public String getCharset() {
        return HttpUtil.getCharset(this);
    }

    /**
     * 获取字节数据
     *
     * @return byte数组
     */
    public byte[] getContent() {
        return content;
    }


    /**
     * 获取文本内容
     *
     * @return 将字节数组转换成文本，可能为空
     */
    public String getText() {
        return HttpUtil.getText(content, this);
    }

    /**
     * 获取Json对象
     *
     * @return 将字节数组转换Json对象（永远不为空）
     */
    public Json getJson() {
        return HttpUtil.getJson(content, this);
    }

    /**
     * 获取Document对象
     *
     * @return 将字节数组转换Document对象（永远不为空）
     */
    public Document getDocument() {
        return HttpUtil.getDocument(content, this);
    }

    /**
     * 获取Image对象
     *
     * @return 将字节数组转换Image对象，可能为空
     */
    public BufferedImage getImage() {
        return HttpUtil.getImage(content, this);
    }

    /**
     * 设置Json数据
     *
     * @param json json数据
     */
    void setContent(Json json) {
        if (json == null)
            return;
        try {
            setContent(json.toString().getBytes(encode));
            contentType.setType("application");
            contentType.setFormat("json");
            contentType.setProperty("charset", encode);
        } catch (UnsupportedEncodingException ignored) {
        }
    }

    /**
     * 设置内容数据
     *
     * @param content 内容数据
     */
    void setContent(byte[] content) {
        this.content = content;
    }

    /**
     * 读取本地文件并设置到内容和内容类型
     *
     * @param file 文件对象
     */
    boolean setContent(File file) {
        if (file == null || !file.isFile())
            return false;
        try {
            content = new FileInputStream(file).readAllBytes();
        } catch (IOException e) {
            return false;
        }
        String postfix = file.getName();
        int index = postfix.lastIndexOf('.');
        if (index != -1) {
            postfix = postfix.substring(index);
            String contentType = HttpUtil.getContentType(postfix, null);
            if (contentType != null)
                setHeader("content-type", contentType);
        }
        return true;
    }
}
